{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "51b2bdfc",
   "metadata": {},
   "source": [
    "# huggingface中使用qwen0.6b模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "405affac",
   "metadata": {},
   "source": [
    "## 1. 调用模型\n",
    "\n",
    "https://hf-mirror.com/Qwen/Qwen3-0.6B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "86938041",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<|im_start|>user\n",
      "请给我简单介绍一下大型语言模型<|im_end|>\n",
      "<|im_start|>assistant\n",
      "<think>\n",
      "\n",
      "</think>\n",
      "\n",
      "\n",
      "{'input_ids': tensor([[151644,    872,    198,  14880, 104169, 100405, 109432, 101951, 102064,\n",
      "         104949, 151645,    198, 151644,  77091,    198, 151667,    271, 151668,\n",
      "            271]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}\n",
      "output_ids [151644, 872, 198, 14880, 104169, 100405, 109432, 101951, 102064, 104949, 151645, 198, 151644, 77091, 198, 151667, 271, 151668, 271, 101951, 102064, 104949, 9909, 34253, 11434, 4903, 3837, 4086, 44, 7552, 101158, 104455, 99361, 3837, 67338, 102217, 100134, 39907, 3837, 100006, 115167, 43959, 103971, 102064, 1773, 104017, 100006, 115167, 43959, 106888, 108704, 3837, 100630, 105293, 5373, 105051, 5373, 105395, 49567, 88802, 3407, 4086, 44, 104867, 101321, 104017, 9370, 2073, 101128, 99788, 33590, 91676, 100006, 101128, 62926, 43959, 101137, 102285, 16744, 9370, 99795, 102064, 1773, 104017, 102119, 104210, 98841, 104034, 9370, 104949, 3837, 29524, 38, 2828, 5373, 33, 529, 5373, 46358, 49567, 3837, 100001, 104949, 18493, 100722, 108704, 20074, 15946, 100134, 26939, 102064, 9370, 104466, 33108, 100144, 3407, 4086, 21634, 18493, 101213, 100650, 101103, 112306, 3837, 77557, 105395, 5373, 105293, 5373, 105041, 5373, 43815, 43959, 49567, 1773, 104017, 100006, 54542, 101312, 102064, 3837, 104117, 101970, 116541, 3837, 20412, 104455, 100650, 101945, 106889, 1773, 151645]\n",
      "thinking content: user\n",
      "请给我简单介绍一下大型语言模型\n",
      "assistant\n",
      "<think>\n",
      "\n",
      "</think>\n",
      "content: 大型语言模型（Large Language Model，LLM）是一种人工智能技术，通过深度学习方法，能够理解和生成人类语言。它们能够理解和生成复杂的文本，包括写作、对话、翻译等任务。\n",
      "\n",
      "LLM的核心在于它们的“理解能力”，即能够理解并生成符合上下文的自然语言。它们通常基于预训练的模型，如GPT、Bert、Transformer等，这些模型在大量文本数据中学习到语言的规律和模式。\n",
      "\n",
      "LLMs在多个领域都有广泛应用，例如翻译、写作、客服、内容生成等。它们能够处理多种语言，适应不同的应用场景，是人工智能领域的重要组成部分。\n",
      "\n",
      "\n",
      "all: user\n",
      "请给我简单介绍一下大型语言模型\n",
      "assistant\n",
      "<think>\n",
      "\n",
      "</think>\n",
      "\n",
      "大型语言模型（Large Language Model，LLM）是一种人工智能技术，通过深度学习方法，能够理解和生成人类语言。它们能够理解和生成复杂的文本，包括写作、对话、翻译等任务。\n",
      "\n",
      "LLM的核心在于它们的“理解能力”，即能够理解并生成符合上下文的自然语言。它们通常基于预训练的模型，如GPT、Bert、Transformer等，这些模型在大量文本数据中学习到语言的规律和模式。\n",
      "\n",
      "LLMs在多个领域都有广泛应用，例如翻译、写作、客服、内容生成等。它们能够处理多种语言，适应不同的应用场景，是人工智能领域的重要组成部分。\n"
     ]
    }
   ],
   "source": [
    "\n",
    "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
    "model_name = \"Qwen/Qwen3-0.6B\"\n",
    "model_folder = r\"D:\\models\\qwen3-0.6b\"\n",
    "\n",
    "# load the tokenizer and the model\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_folder)\n",
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    model_folder,\n",
    "    torch_dtype=\"auto\",\n",
    "    device_map=\"auto\"\n",
    ")\n",
    "\n",
    "# prompt = \"Give me a short introduction to large language model.\"\n",
    "prompt = \"请给我简单介绍一下大型语言模型\"\n",
    "messages = [\n",
    "    {\"role\": \"user\", \"content\": prompt}\n",
    "]\n",
    "\n",
    "text = tokenizer.apply_chat_template(\n",
    "    messages,\n",
    "    tokenize=False,\n",
    "    add_generation_prompt=True,\n",
    "    enable_thinking=False # Switches between thinking and non-thinking modes. Default is True.\n",
    ")\n",
    "print(text)\n",
    "model_inputs = tokenizer([text], return_tensors=\"pt\").to(model.device)\n",
    "print(model_inputs)\n",
    "\n",
    "generated_ids = model.generate(\n",
    "    **model_inputs,\n",
    "    max_new_tokens=32768\n",
    ")\n",
    "\n",
    "# output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist() \n",
    "output_ids = generated_ids[0].tolist() \n",
    "print(\"output_ids\",output_ids)\n",
    "\n",
    "try:\n",
    "    # rindex finding 151668 (</think>)\n",
    "    index = len(output_ids) - output_ids[::-1].index(151668) # [1,2,3,4,5,111,22,33 111 123 123 333]\n",
    "except ValueError:\n",
    "    index = 0    \n",
    "\n",
    "thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip(\"\\n\")\n",
    "content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip(\"\\n\")\n",
    "all = tokenizer.decode(output_ids, skip_special_tokens=True).strip(\"\\n\")\n",
    "\n",
    "print(\"thinking content:\", thinking_content)\n",
    "print(\"content:\", content)\n",
    "print('\\n')\n",
    "print(\"all:\", all)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "691d0c68",
   "metadata": {},
   "source": [
    "##  2. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "240db43f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 详细见代码"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ab4939a",
   "metadata": {},
   "source": [
    "## 查看训练结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e910e646",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "all:\n",
      " system\n",
      "你是一个医学专家，你需要根据用户的问题，给出带有思考的回答。\n",
      "user\n",
      "医生，我最近被诊断为糖尿病，听说碳水化合物的选择很重要，我应该选择什么样的碳水化合物呢？\n",
      "assistant\n",
      "<think>\n",
      "好的，用户被诊断为糖尿病，现在想知道应该选择什么样的碳水化合物。首先，我需要明确糖尿病患者需要控制碳水化合物摄入，因为高血糖会影响身体，尤其是肾脏和胰岛。用户可能已经了解这一点，但需要更具体的建议。\n",
      "\n",
      "接下来，我应该考虑用户可能的背景。他们可能没有太多医学知识，所以需要解释清楚碳水化合物的重要性，并给出具体的建议。需要强调控制碳水化合物的摄入量，同时推荐低升糖指数（GI）的食物，比如全谷物和豆类，而不是精制糖和高GI食物。\n",
      "\n",
      "还要考虑用户可能的饮食习惯，比如他们是否已经尝试过某些食物，或者是否有其他饮食偏好。可能需要提醒他们避免加工食品和高糖饮料，同时建议咨询营养师以制定个性化计划。\n",
      "\n",
      "另外，用户可能没有提到其他饮食需求，比如是否有特定的饮食限制，或者是否有其他健康问题。需要确保回答全面，涵盖饮食建议、注意事项以及可能的后续步骤，比如与营养师合作。\n",
      "\n",
      "最后，确保回答用词准确，避免专业术语，让用户容易理解，并鼓励他们采取积极的行动，比如咨询医生或营养师，以更好地管理糖尿病。\n",
      "</think>\n",
      "\n",
      "对于糖尿病患者来说，选择合适的碳水化合物非常重要，因为它们会显著影响血糖水平。以下是一些关键建议：\n",
      "\n",
      "1. **低升糖指数（GI）食物**：优先选择全谷物（如全麦面包、全麦米饭、燕麦等），这些食物的升糖速度较慢，有助于稳定血糖。豆类、根茎类蔬菜（如红薯、紫薯）等也是良好的选择。\n",
      "\n",
      "2. **控制碳水摄入**：根据血糖水平调整碳水摄入量，通常建议每日总碳水摄入量不超过250-350克（具体需根据体重和空腹血糖水平调整）。避免精制碳水（如白面包、蛋糕）和高GI食物（如甜点、含糖饮料）。\n",
      "\n",
      "3. **避免加工食品**：加工食品通常含有高糖和高升糖成分，如含糖饮料、含糖零食等，这些会迅速升高血糖。\n",
      "\n",
      "4. **咨询营养师**：个性化饮食计划需结合个人情况（如体重、健康状况、药物使用等），建议与营养师合作制定方案。\n",
      "\n",
      "5. **注意饮食习惯**：避免暴饮暴食，保持规律的饮食节奏，有助于稳定血糖水平。\n",
      "\n",
      "总之，糖尿病患者应通过合理选择碳水化合物，结合饮食控制和健康生活方式，逐步改善血糖管理。\n"
     ]
    }
   ],
   "source": [
    "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
    "model_name = \"Qwen/Qwen3-0.6B\"\n",
    "model_folder = r\"D:\\models\\qwen3-0.6b\"\n",
    "\n",
    "# load the tokenizer and the model\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_folder)\n",
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    model_folder,\n",
    "    torch_dtype=\"auto\",\n",
    "    device_map=\"auto\"\n",
    ")\n",
    "\n",
    "# prompt = \"Give me a short introduction to large language model.\"\n",
    "test_texts = {\n",
    "    'instruction': \"你是一个医学专家，你需要根据用户的问题，给出带有思考的回答。\",\n",
    "    'input': \"医生，我最近被诊断为糖尿病，听说碳水化合物的选择很重要，我应该选择什么样的碳水化合物呢？\"\n",
    "}\n",
    "instruction = test_texts['instruction']\n",
    "input_value = test_texts['input']\n",
    "\n",
    "messages = [\n",
    "    {\"role\": \"system\", \"content\": f\"{instruction}\"},\n",
    "    {\"role\": \"user\", \"content\": f\"{input_value}\"}\n",
    "]\n",
    "\n",
    "text = tokenizer.apply_chat_template(\n",
    "    messages,\n",
    "    tokenize=False,\n",
    "    add_generation_prompt=True,\n",
    "    enable_thinking=True # Switches between thinking and non-thinking modes. Default is True.\n",
    ")\n",
    "# print(text)\n",
    "model_inputs = tokenizer([text], return_tensors=\"pt\").to(model.device)\n",
    "# print(model_inputs)\n",
    "\n",
    "generated_ids = model.generate(\n",
    "    **model_inputs,\n",
    "    max_new_tokens=32768\n",
    ")\n",
    "\n",
    "# output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist() \n",
    "output_ids = generated_ids[0].tolist() \n",
    "# print(\"output_ids\",output_ids)\n",
    "\n",
    "try:\n",
    "    # rindex finding 151668 (</think>)\n",
    "    index = len(output_ids) - output_ids[::-1].index(151668) # [1,2,3,4,5,111,22,33 111 123 123 333]\n",
    "except ValueError:\n",
    "    index = 0    \n",
    "\n",
    "thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip(\"\\n\")\n",
    "content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip(\"\\n\")\n",
    "all = tokenizer.decode(output_ids, skip_special_tokens=True).strip(\"\\n\")\n",
    "\n",
    "# print(\"thinking content:\", thinking_content)\n",
    "# print(\"content:\", content)\n",
    "# print('\\n')\n",
    "print(\"all:\\n\", all)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "94c5ed38",
   "metadata": {},
   "outputs": [],
   "source": [
    "### 使用训练后的模型预测的结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "07c75b22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<think>嗯，用户的问题是关于糖尿病患者选择哪种类型的碳水化合物。首先，我需要回忆一下糖尿病的基本知识。糖尿病是高血糖血症，导致血糖升高，所以碳水化合物的选择需要根据血糖水平来调整。\n",
      "\n",
      "首先想到的是碳水化合物的分类。碳水化合物通常分为全谷物和杂粮。全谷物应该包括全谷物，比如全谷物、全谷物、杂粮等，这些都含有碳，但碳摄入比例低，所以可能属于低碳的。而杂粮的话，可能因为含有碳，但比例高，所以属于高碳的。不过用户的问题里提到的是高碳，所以需要确认一下分类是否正确。\n",
      "\n",
      "然后，根据糖尿病的血糖水平，碳水化合物的选择应该根据总碳量。比如，如果总碳量在正常范围内，可能可以吃，但高碳的话，可能因为高碳导致血糖升高，所以需要低碳的，比如全谷物和杂粮。同时，碳水化合物的总碳量控制在正常范围，比如1-2克，这样血糖会升高，但可能不会导致高血糖，除非是高血糖素，但问题里提到的是高血糖素，所以可能需要考虑是否正确。\n",
      "\n",
      "另外，用户的问题里还提到自己被诊断为糖尿病，所以需要考虑患者的饮食习惯和饮食习惯。比如，如果患者有高血糖素的需求，可能需要控制碳水化合物的摄入，因为高血糖素本身是碳水化合物，但可能因为碳水化合物摄入而升高血糖，所以需要低碳的，比如全谷物和杂粮。另外，碳水化合物的摄入比例要控制在正常范围，比如1-2克，这样血糖不会升高，但可能因为高血糖素而升高，所以需要低碳。\n",
      "\n",
      "可能用户还有其他疑问，比如为什么需要低碳的，或者是否应该选择全谷物，因为全谷物虽然碳少，但热量高，所以可能因为低碳而高血糖素升高，所以需要低碳的。另外，碳水化合物的摄入比例要控制在正常范围，避免高血糖，所以可能需要控制碳水化合物的摄入量，但也要注意是否有高血糖素，可能需要避免。\n",
      "\n",
      "还要考虑用户的饮食习惯，比如是否需要控制碳水化合物的摄入，或者是否需要低碳的。另外，碳水化合物的摄入比例是否需要调整，可能需要参考指南或者营养建议。同时，是否需要考虑碳水化合物的摄入量，但高血糖素可能因为高血糖素而升高血糖，所以低碳的摄入需要控制。\n",
      "\n",
      "总结下来，回答的结构应该是先解释碳水化合物的分类，然后根据糖尿病的血糖水平选择低碳的，接着说明碳水化合物的控制，最后结合用户的饮食习惯给出建议。这样既回答了问题，又满足了用户的潜在需求，比如如何调整饮食，避免高血糖素，以及如何控制碳水化合物的摄入量。\n",
      "</think> \n",
      " 您应该选择低碳的碳水化合物，比如全谷物、杂粮和全谷物，这些食物中的碳摄入量较低，可以吃，但碳水化合物的摄入量需要控制在正常范围内，以避免因高血糖素而升高血糖。同时，碳水化合物的摄入量不能低于正常范围，以避免因高血糖素而升高血糖。建议您根据自己的饮食习惯，比如是否需要控制碳水化合物的摄入，或者是否需要选择其他低碳的碳水化合物，如全谷物、杂粮和全谷物，这些虽然碳水化合物较少，但热量丰富，所以可以吃。如果有任何疑问，建议您咨询营养师或医生。\n"
     ]
    }
   ],
   "source": [
    "print('''<think>嗯，用户的问题是关于糖尿病患者选择哪种类型的碳水化合物。首先，我需要回忆一下糖尿病的基本知识。糖尿病是高血糖血症，导致血糖升高，所以碳水化合物的选择需要根据血糖水平来调整。\n",
    "\n",
    "首先想到的是碳水化合物的分类。碳水化合物通常分为全谷物和杂粮。全谷物应该包括全谷物，比如全谷物、全谷物、杂粮等，这些都含有碳，但碳摄入比例低，所以可能属于低碳的。而杂粮的话，可能因为含有碳，但比例高，所以属于高碳的。不过用户的问题里提到的是高碳，所以需要确认一下分类是否正确。\n",
    "\n",
    "然后，根据糖尿病的血糖水平，碳水化合物的选择应该根据总碳量。比如，如果总碳量在正常范围内，可能可以吃，但高碳的话，可能因为高碳导致血糖升高，所以需要低碳的，比如全谷物和杂粮。同时，碳水化合物的总碳量控制在正常范围，比如1-2克，这样血糖会升高，但可能不会导致高血糖，除非是高血糖素，但问题里提到的是高血糖素，所以可能需要考虑是否正确。\n",
    "\n",
    "另外，用户的问题里还提到自己被诊断为糖尿病，所以需要考虑患者的饮食习惯和饮食习惯。比如，如果患者有高血糖素的需求，可能需要控制碳水化合物的摄入，因为高血糖素本身是碳水化合物，但可能因为碳水化合物摄入而升高血糖，所以需要低碳的，比如全谷物和杂粮。另外，碳水化合物的摄入比例要控制在正常范围，比如1-2克，这样血糖不会升高，但可能因为高血糖素而升高，所以需要低碳。\n",
    "\n",
    "可能用户还有其他疑问，比如为什么需要低碳的，或者是否应该选择全谷物，因为全谷物虽然碳少，但热量高，所以可能因为低碳而高血糖素升高，所以需要低碳的。另外，碳水化合物的摄入比例要控制在正常范围，避免高血糖，所以可能需要控制碳水化合物的摄入量，但也要注意是否有高血糖素，可能需要避免。\n",
    "\n",
    "还要考虑用户的饮食习惯，比如是否需要控制碳水化合物的摄入，或者是否需要低碳的。另外，碳水化合物的摄入比例是否需要调整，可能需要参考指南或者营养建议。同时，是否需要考虑碳水化合物的摄入量，但高血糖素可能因为高血糖素而升高血糖，所以低碳的摄入需要控制。\n",
    "\n",
    "总结下来，回答的结构应该是先解释碳水化合物的分类，然后根据糖尿病的血糖水平选择低碳的，接着说明碳水化合物的控制，最后结合用户的饮食习惯给出建议。这样既回答了问题，又满足了用户的潜在需求，比如如何调整饮食，避免高血糖素，以及如何控制碳水化合物的摄入量。\n",
    "</think> \n",
    " 您应该选择低碳的碳水化合物，比如全谷物、杂粮和全谷物，这些食物中的碳摄入量较低，可以吃，但碳水化合物的摄入量需要控制在正常范围内，以避免因高血糖素而升高血糖。同时，碳水化合物的摄入量不能低于正常范围，以避免因高血糖素而升高血糖。建议您根据自己的饮食习惯，比如是否需要控制碳水化合物的摄入，或者是否需要选择其他低碳的碳水化合物，如全谷物、杂粮和全谷物，这些虽然碳水化合物较少，但热量丰富，所以可以吃。如果有任何疑问，建议您咨询营养师或医生。''')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be82a004",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
